/* 
商家功能模块相关数据管理
*/
import {
  RECEIEVE_GOODS,
  RECEIEVE_RATINGS,
  RECEIEVE_INFO,
  ADD_FOOD_COUNT,
  RECEIVE_SHOP,
  REDUCE_FOOD_COUNT
} from '../mutations._type.js'
import {
  reqGoods,
  reqRatings,
  reqInfo,
  reqShop
} from '../../api'
import Vue from 'vue'
export default {
  state: {
    // goods: [], //商家的食品列表
    // ratings: [], //商家的评论列表
    // info: {}, //商家的信息
    shop: {} //当前的商铺
  },
  mutations: {
    // [RECEIEVE_GOODS](state, goods) {
    //   state.goods = goods
    // },
    // [RECEIEVE_RATINGS](state, ratings) {
    //   state.ratings = ratings
    // },
    // [RECEIEVE_INFO](state, info) {
    //   state.info = info
    // },
    [ADD_FOOD_COUNT](state, food) {
      //food中原本是没有count的。没有的话就行添加一个count并让他==1.但是新添加的属性。vue无法进行数据绑定。Vue无法探测普通的新增property
      // 需要用到Vue.set()方法进添加。用过之后，新添加的属性就可以进行数据绑定,且触发视图更新。
      if (food.count) food.count++ //food中有count
      else {
        //food中没有count, 用 Vue.set()添加count属性
        // 如果food中没有count, 给food添加count属性, 值为1
        // 问题: 给响应式对象添加一个新的属性, 没有数据绑定效果(不是响应式的)
        // food.count = 1
        // 解决: 给响应式对象添加一个响应式属性  
        // Vue.set( target, key, value )
        Vue.set(food, 'count', 1)
      }

    },
    [REDUCE_FOOD_COUNT](state, food) {
      if (food.count > 0) food.count-- //当数量food.count > 0 时 count--
    },

    [RECEIVE_SHOP](state, {
      shop = {}
    }) {
      console.log(shop);
      state.shop = shop
    }
  },
  actions: {
    // 异步获取商家食品列表
    // async getShopGoods({
    //   commit
    // }, cb) { //cb是callback 如果传函数过来就可以调用
    //   const result = await reqGoods()

    //   if (result.code === 0) {
    //     const goods = result.data
    //     commit(RECEIEVE_GOODS, goods)
    //     typeof cb === 'function' && cb() // 如果传过来的函数就直接调用。是其他类型的值这里不执行 
    //     // 在每一个action里都可以加这个判断
    //   }

    // },
    // // 异步获取商家评论列表
    // async getShopRatings({
    //   commit
    // }, cb) {
    //   const result = await reqRatings()

    //   if (result.code === 0) {
    //     const ratings = result.data
    //     commit(RECEIEVE_RATINGS, ratings)
    //     typeof cb === 'function' && cb() // 如果传过来的函数就直接调用。是其他类型的值这里不执行
    //   }

    // },
    // // 异步获取商家信息
    // async getShopInfo({
    //   commit
    // }, cb) {
    //   const result = await reqInfo()

    //   if (result.code === 0) {
    //     const info = result.data
    //     commit(RECEIEVE_INFO, info)
    //     typeof cb === 'function' && cb() // 如果传过来的函数就直接调用。是其他类型的值这里不执行
    //   }
    // },

    async getShop({
      commit,
      state
    }, id) {
      if (id === state.shop.id) return
      if (state.shop.id) { //清空之前的商铺
        commit(RECEIVE_SHOP, {})
      }
      // 清空之后发ajax请求
      const result = await reqShop(id)
      if (result.code === 0) {
        const shop = result.data
        commit(RECEIVE_SHOP, {
          shop
        })
      }

    },


    // 更新food中的数量（同步action）就更新加菜减菜的food
    updateFoodCount({
      commit
    }, {
      isAddFoodCount,
      food
    }) {
      if (isAddFoodCount) {
        commit(ADD_FOOD_COUNT, food)
      } else {
        commit(REDUCE_FOOD_COUNT, food)
      }
    }

  },
  getters: {
    // 计算满意的评论有多少个
    positiveSize(state) {
      return state.shop.ratings.reduce((pre, rating) => {
        const {
          rateType
        } = rating
        return pre + (rateType === 0 ? 1 : 0)
      }, 0)
    }

  }
}